#define _CRT_SECURE_NO_WARNINGS 1

struct ListNode
{
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};
 
 // class Solution {
 // public:
 //     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
 //     {
 //         ListNode* ret = nullptr;
 //         int carry = 0;
 //         while(l1 != nullptr || l2 != nullptr)
 //         {
 //             int val1 = 0;
 //             int val2 = 0;
 //             if(l1 != nullptr)
 //             {
 //                 val1 = l1->val;
 //                 l1 = l1->next;
 //             }
 //             if(l2 != nullptr)
 //             {
 //                 val2 = l2->val;
 //                 l2 = l2->next;
 //             }
 //             int val = val1 + val2 + carry;
 //             carry = val/10;
 //             val%=10;

 //             ret = new ListNode(val,ret);

 //         }
 //         if(carry!=0)
 //         {
 //             ret = new ListNode(carry,ret);
 //         }
 //         return ret;
 //     }
 // };

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode* ret = nullptr;
        ListNode* tail = ret;
        int carry = 0;
        while (l1 != nullptr || l2 != nullptr)
        {
            int val1 = 0;
            int val2 = 0;
            if (l1 != nullptr)
            {
                val1 = l1->val;
                l1 = l1->next;
            }
            if (l2 != nullptr)
            {
                val2 = l2->val;
                l2 = l2->next;
            }
            int val = val1 + val2 + carry;
            carry = val / 10;
            val %= 10;

            ListNode* node = new ListNode(val);
            if (ret == nullptr)
            {
                ret = tail = node;
            }
            else
            {
                tail->next = node;
                tail = tail->next;
            }
        }
        if (carry != 0)
        {
            tail->next = new ListNode(carry);
        }
        return ret;
    }
};